#pragma once
#include "../math/matrix.h"
#include "../adtype/cdynamicarray.h"
#include "../macros/assertions.h"
#include <string>

namespace NEngine {

// ================================================================================================
// CImport base class
// ================================================================================================
class CImport {

    protected:
        CDynamicArray<std::wstring> files;         // -- list of all the files
        bool built;                                // -- flag for built

        // -- iterate the file until all resources are built
        virtual int IterateFile(std::fstream&);

    public:

        // -- lifetime
        CImport();
        CImport(CDynamicArray<std::wstring> files_);

        // -- build the data from the file
        virtual void Import() = 0;

        // accessors
        void SetFile(const CDynamicArray<std::wstring>& files);
};

inline int CImport::IterateFile(std::fstream&) {
    return 0;
}

// ================================================================================================
// Accessors
// ================================================================================================
inline CImport::CImport() {
}

inline void CImport::SetFile(const CDynamicArray<std::wstring>& files_) {
    files = files_;
}

// ================================================================================================
// Default constructor
// ================================================================================================
inline CImport::CImport(CDynamicArray<std::wstring> files_) : files(files_), built(false) {
}

// ================================================================================================
// CImportObject handles object importation
// ================================================================================================
class CImportObject : public CImport {

public:

    // -- contains all essential data
    struct SObject {
        CDynamicArray<std::string> names;
        CDynamicArray<ushort> numindices;
        CDynamicArray<ushort> numverts;
        CDynamicArray<ushort> numnorms;
        CDynamicArray<ushort> indices;
    	CDynamicArray<Vector4> vertices;
        CDynamicArray<Vector4> normals;
    	CDynamicArray<Vector4> colors;
    	CDynamicArray<Matrix4x4> wmats;
    };

protected:

    SObject objects;

    // -- iterate the file until all objects are built
    virtual int IterateFile(std::fstream& object, uint& curoffset);

public:

    // -- constructor
    CImportObject();
    CImportObject(CDynamicArray<std::wstring> _files);

    // -- build data
    virtual void Import();

    // -- accessor methods
    virtual SObject& GetObjects();

};

// ================================================================================================
// Constructor
// ================================================================================================
inline CImportObject::CImportObject() {
}

inline CImportObject::CImportObject(CDynamicArray<std::wstring> files_) : CImport(files_) {
}

// ================================================================================================
// Accessor methods
// ================================================================================================
inline CImportObject::SObject& CImportObject::GetObjects() {
    if(!built)
        Import();

    return objects;
}

// ================================================================================================
// CImportLights handles light import 
// ================================================================================================
class CImportLights : public CImport {

public:

    struct SLightObj {
        CDynamicArray<Matrix4x4> dirlights;
        CDynamicArray<Vector4> dirclrs;
        CDynamicArray<Matrix4x4> ptlights;
        CDynamicArray<Vector4> ptclrs;
        CDynamicArray<Vector4> sptlightsor;
        CDynamicArray<Vector4> sptlightspos;
        CDynamicArray<Vector4> sptclrs;
        CDynamicArray<float> dirintenses;
        CDynamicArray<float> ptintenses;
        CDynamicArray<float> sptintenses;
        CDynamicArray<float> sptumbras;
        CDynamicArray<float> sptpenums;
        CDynamicArray<std::string> dirnames;
        CDynamicArray<std::string> ptnames;
        CDynamicArray<std::string> sptnames;
        uint numdirlights;
        uint numptlights;
        uint numsptlights;
   };

protected:    

    SLightObj lobjects;

    virtual int IterateFile(std::fstream& file);

public:


    // -- constructor
    CImportLights();
    CImportLights(CDynamicArray<std::wstring> files_);

    // -- public interface
    virtual void Import();

    // -- accessor method
    SLightObj& GetObjects();

};

// ================================================================================================
// Constructor
// ================================================================================================
inline CImportLights::CImportLights() {
}

inline CImportLights::CImportLights(CDynamicArray<std::wstring> files_) : CImport(files_) {
}

// ================================================================================================
// Get Light objects
// ================================================================================================
inline CImportLights::SLightObj& CImportLights::GetObjects() {
    if(!built)
        Import();

    return lobjects;
}

} // namespace NEngine